package com.example.zheng.token;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @date 2021/11/17 - 22:07
 */
/**
        * @Desc jwt工具类
        * @Author houry
        * @Date 2021/1/5 10:09
        **/
public class JwtUtil {
    /**
     * 秘钥：需要妥善保存，一旦泄露token有可能被破解
     */
    private static final String SECRET = "这里是你的私钥";
    /**
     * 签名算法：推荐使用HMAC256
     */
    private static final Algorithm ALGORITHM = Algorithm.HMAC256(SECRET);

    /**
     * 设置默认过期时间 1000*60*60=3600000=1h
     * 单位毫秒，5*1000为5秒
     */
    private static final Long EXPIRE_DATE = 24*3600000L;

    /**
     * 获取token信息
     *
     * @param username password 自定义的条件，可在token中传递我们的信息,这里存的是用户名跟密码
     * @return token令牌
     */
    public static String getToken(Map<String, String> claimMap) {
        return getToken(claimMap, EXPIRE_DATE);
    }

    /**
     * @param claimMap 自定义条件，可在token中传递我们的信息
     * @param expire   过期时间 单位：毫秒
     * @return token令牌
     */
    public static String getToken(Map<String, String> claimMap, Long expire) {
        JWTCreator.Builder builder = JWT.create();
        //存入有效数据
        claimMap.forEach(builder::withClaim);
        //设置过期时间
        builder.withExpiresAt(new Date(System.currentTimeMillis() + expire));
        return builder.sign(ALGORITHM);
    }

    //获取数据  JwtUtil.getDecodedJWT(token).getClaim(String key).asString()
    /**
     * 获取DecodedJWT
     *
     * @param token token令牌
     * @return DecodedJWT
     */
    public static DecodedJWT getDecodedJWT(String token) {
        return JWT.require(ALGORITHM).build().verify(token);
    }

    /**
     * 获取DecodedJWT
     *
     * @param algorithm 指定算法
     * @param token     token令牌
     * @return DecodedJWT
     */
    public static DecodedJWT getDecodedJWT(Algorithm algorithm, String token) {
        return JWT.require(algorithm).build().verify(token);
    }
}
